Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / frontend / CallCodec2Regressions.test.js

Displaying Raw • Download


tests/frontend/CallCodec2Regressions.test.js 63f836b03d64eac4fa716b2ada23ab565c2b455e (63f836b0) Text, 11.80 KB

T8b949e/**
* Regression guards for call dialing / contact form / Android ringtone policy.
*
* Locks in:
* - 32-char RNS hash extraction (was only matching 64-char hex)
* - History add-contact must not store LXMF/LXST dest as identity hash
* - telephone_ringing respects block_all_from_strangers as well as contacts-only
*/
Tff7b72import Tb4b4b4{ Te6edf3mount Tb4b4b4} Tff7b72from Ta5d6ff"@vue/test-utils"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3itTb4b4b4, Te6edf3expectTb4b4b4, Te6edf3viTb4b4b4, Te6edf3beforeEachTb4b4b4, Te6edf3afterEach Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3createRouterTb4b4b4, Te6edf3createWebHashHistory Tb4b4b4} Tff7b72from Ta5d6ff"vue-router"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3createI18n Tb4b4b4} Tff7b72from Ta5d6ff"vue-i18n"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3createVuetify Tb4b4b4} Tff7b72from Ta5d6ff"vuetify"Tb4b4b4;
Tff7b72import Te6edf3CallPage Tff7b72from Ta5d6ff"@/components/call/CallPage.vue"Tb4b4b4;
Tff7b72import Te6edf3App Tff7b72from Ta5d6ff"../../meshchatx/src/frontend/components/App.vue"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3appPackageVersion Tb4b4b4} Tff7b72from Ta5d6ff"./fixtures/repoPackageVersion.js"Tb4b4b4;

Tff7b72const Te6edf3vuetify Tff7b72= Te6edf3createVuetifyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3i18n Tff7b72= Te6edf3createI18nTb4b4b4(Tb4b4b4{
Te6edf3legacyTff7b72: Tff7b72falseTb4b4b4,
Te6edf3localeTff7b72: Ta5d6ff"en"Tb4b4b4,
Te6edf3messagesTff7b72: Tb4b4b4{
Te6edf3enTff7b72: Tb4b4b4{
Te6edf3callTff7b72: Tb4b4b4{
Te6edf3enter_identity_hash_to_call_errorTff7b72: Ta5d6ff"Enter a hash"Tb4b4b4,
Te6edf3name_and_hash_requiredTff7b72: Ta5d6ff"Name and hash required"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3appTff7b72: Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"MeshChatX"Tb4b4b4,
Te6edf3changelog_titleTff7b72: Ta5d6ff"What's New"Tb4b4b4,
Te6edf3do_not_show_againTff7b72: Ta5d6ff"Do not show again"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3commonTff7b72: Tb4b4b4{ Te6edf3closeTff7b72: Ta5d6ff"Close" Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3describeTb4b4b4(Ta5d6ff"Call dial / contact regressions"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72let Te6edf3axiosMockTb4b4b4;

Te6edf3beforeEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3axiosMock Tff7b72= Tb4b4b4{
Te6edf3getTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/config"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{
Te6edf3configTff7b72: Tb4b4b4{
Te6edf3telephone_enabledTff7b72: Tff7b72trueTb4b4b4,
Te6edf3telephone_allow_calls_from_contacts_onlyTff7b72: Tff7b72trueTb4b4b4,
Te6edf3telephone_audio_profile_idTff7b72: T79c0ff64Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/status"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{
Te6edf3enabledTff7b72: Tff7b72trueTb4b4b4,
Te6edf3active_callTff7b72: Tff7b72nullTb4b4b4,
Te6edf3initiation_statusTff7b72: Tff7b72nullTb4b4b4,
Te6edf3web_audioTff7b72: Tb4b4b4{ Te6edf3enabledTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/audio-profiles"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3default_audio_profile_idTff7b72: T79c0ff64Tb4b4b4, Te6edf3audio_profilesTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/contacts"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3contactsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3total_countTff7b72: T79c0ff0 Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/history"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3call_historyTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/voicemail"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{
Te6edf3has_espeakTff7b72: Tff7b72falseTb4b4b4,
Te6edf3is_recordingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3is_greeting_recordingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3has_greetingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3voicemailsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3unread_countTff7b72: T79c0ff0Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/ringtones"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/call/"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3messageTff7b72: Ta5d6ff"Call initiation started" Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/announces"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3announcesTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3postTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/call/"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3messageTff7b72: Ta5d6ff"Call initiation started" Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tff7b72deleteTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3api Tff7b72= Te6edf3axiosMockTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3afterEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72delete Tffa657windowTb4b4b4.Te6edf3apiTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3mountCallPage Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=>
Te6edf3mountTb4b4b4(Te6edf3CallPageTb4b4b4, Tb4b4b4{
Tffa657globalTff7b72: Tb4b4b4{
Te6edf3mocksTff7b72: Tb4b4b4{
Te6edf3$tTff7b72: Tb4b4b4(Te6edf3keyTb4b4b4) Tb4b4b4=> Te6edf3keyTb4b4b4,
Te6edf3$routeTff7b72: Tb4b4b4{ Te6edf3queryTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3stubsTff7b72: Tb4b4b4{
Te6edf3MaterialDesignIconTff7b72: Tff7b72trueTb4b4b4,
Te6edf3LoadingSpinnerTff7b72: Tff7b72trueTb4b4b4,
Te6edf3LxmfUserIconTff7b72: Tff7b72trueTb4b4b4,
Te6edf3ToggleTff7b72: Tff7b72trueTb4b4b4,
Te6edf3AudioWaveformPlayerTff7b72: Tff7b72trueTb4b4b4,
Te6edf3RingtoneEditorTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"regression: dialer accepts 32-char RNS hashes from pasted text"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountCallPageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hash32 Tff7b72= Ta5d6ff"cd"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3callTb4b4b4(Ta5d6ff`Ta5d6ffplease call Tffd700${Te6edf3hash32Tffd700}Ta5d6ff nowTa5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/telephone/call/Tffd700${Te6edf3hash32Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"regression: dialer does not require 64-char hex"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountCallPageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hash32 Tff7b72= Ta5d6ff"ef"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3callTb4b4b4(Te6edf3hash32Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3axiosMockTb4b4b4.Te6edf3postTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/telephone/call/Tffd700${Te6edf3hash32Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"regression: addContactFromHistory keeps identity and destination fields separate"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountCallPageTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3$nextTickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3identity Tff7b72= Ta5d6ff"11"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3lxmf Tff7b72= Ta5d6ff"22"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3lxst Tff7b72= Ta5d6ff"33"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3addContactFromHistoryTb4b4b4(Tb4b4b4{
Te6edf3remote_identity_nameTff7b72: Ta5d6ff"Pat"Tb4b4b4,
Te6edf3remote_identity_hashTff7b72: Te6edf3identityTb4b4b4,
Te6edf3remote_destination_hashTff7b72: Te6edf3lxmfTb4b4b4,
Te6edf3remote_telephony_hashTff7b72: Te6edf3lxstTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3contactFormTb4b4b4.Te6edf3remote_identity_hashTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3contactFormTb4b4b4.Te6edf3lxmf_addressTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3lxmfTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3contactFormTb4b4b4.Te6edf3lxst_addressTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3lxstTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3contactFormTb4b4b4.Te6edf3remote_identity_hashTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3lxmfTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3contactFormTb4b4b4.Te6edf3remote_identity_hashTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3lxstTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3describeTb4b4b4(Ta5d6ff"App telephone_ringing policy regressions"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72let Te6edf3axiosMockTb4b4b4;
Tff7b72let Te6edf3routerTb4b4b4;

Te6edf3beforeEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3router Tff7b72= Te6edf3createRouterTb4b4b4(Tb4b4b4{
Te6edf3historyTff7b72: Te6edf3createWebHashHistoryTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3routesTff7b72: Tb4b4b4[
Tb4b4b4{ Te6edf3pathTff7b72: Ta5d6ff"/"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"messages"Tb4b4b4, Te6edf3componentTff7b72: Tb4b4b4{ Te6edf3templateTff7b72: Ta5d6ff"<div/>" Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3pathTff7b72: Ta5d6ff"/call"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"call"Tb4b4b4, Te6edf3componentTff7b72: Tb4b4b4{ Te6edf3templateTff7b72: Ta5d6ff"<div/>" Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3axiosMock Tff7b72= Tb4b4b4{
Te6edf3getTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3url Tff7b72=== Ta5d6ff"/api/v1/app/info"Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{
Te6edf3app_infoTff7b72: Tb4b4b4{
Te6edf3versionTff7b72: Te6edf3appPackageVersionTb4b4b4,
Te6edf3tutorial_seenTff7b72: Tff7b72trueTb4b4b4,
Te6edf3changelog_seen_versionTff7b72: Te6edf3appPackageVersionTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3url Tff7b72=== Ta5d6ff"/api/v1/config"Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{
Te6edf3configTff7b72: Tb4b4b4{
Te6edf3themeTff7b72: Ta5d6ff"dark"Tb4b4b4,
Te6edf3do_not_disturb_enabledTff7b72: Tff7b72falseTb4b4b4,
Te6edf3telephone_allow_calls_from_contacts_onlyTff7b72: Tff7b72falseTb4b4b4,
Te6edf3block_all_from_strangersTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3url Tff7b72=== Ta5d6ff"/api/v1/auth/status"Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3auth_enabledTff7b72: Tff7b72false Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3url Tff7b72=== Ta5d6ff"/api/v1/blocked-destinations"Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3blocked_destinationsTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"/api/v1/telephone/status"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3enabledTff7b72: Tff7b72trueTb4b4b4, Te6edf3active_callTff7b72: Tff7b72nullTb4b4b4, Te6edf3initiation_statusTff7b72: Tff7b72null Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3postTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3api Tff7b72= Te6edf3axiosMockTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3afterEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72delete Tffa657windowTb4b4b4.Te6edf3apiTb4b4b4;
Te6edf3viTb4b4b4.Te6edf3restoreAllMocksTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72async Tff7b72function Te6edf3mountAppTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Te6edf3mountTb4b4b4(Te6edf3AppTb4b4b4, Tb4b4b4{
Tffa657globalTff7b72: Tb4b4b4{
Te6edf3pluginsTff7b72: Tb4b4b4[Te6edf3routerTb4b4b4, Te6edf3vuetifyTb4b4b4, Te6edf3i18nTb4b4b4]Tb4b4b4,
Te6edf3stubsTff7b72: Tb4b4b4{
Te6edf3MaterialDesignIconTff7b72: Tff7b72trueTb4b4b4,
Te6edf3LxmfUserIconTff7b72: Tff7b72trueTb4b4b4,
Te6edf3LanguageSelectorTff7b72: Tff7b72trueTb4b4b4,
Te6edf3CallOverlayTff7b72: Tff7b72trueTb4b4b4,
Te6edf3CommandPaletteTff7b72: Tff7b72trueTb4b4b4,
Te6edf3IntegrityWarningModalTff7b72: Tff7b72trueTb4b4b4,
Te6edf3RouterViewTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VDialogTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VCardTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VCardTextTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VCardActionsTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VBtnTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VIconTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VToolbarTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VToolbarTitleTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VSpacerTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VProgressCircularTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VCheckboxTff7b72: Tff7b72trueTb4b4b4,
Te6edf3VDividerTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3routerTb4b4b4.Te6edf3isReadyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3rTb4b4b4) Tb4b4b4=> Te6edf3setTimeoutTb4b4b4(Te6edf3rTb4b4b4, T79c0ff30Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3wrapperTb4b4b4;
Tb4b4b4}

Te6edf3itTb4b4b4(Ta5d6ff"regression: block_all_from_strangers suppresses ringtone for non-contacts"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Tff7b72await Te6edf3mountAppTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3config Tff7b72= Tb4b4b4{
Te6edf3do_not_disturb_enabledTff7b72: Tff7b72falseTb4b4b4,
Te6edf3telephone_allow_calls_from_contacts_onlyTff7b72: Tff7b72falseTb4b4b4,
Te6edf3block_all_from_strangersTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3playRingtone Tff7b72= Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4, Ta5d6ff"playRingtone"Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3handlers Tff7b72= Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3getShellWsHandlersTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3handlersTb4b4b4.Te6edf3telephone_ringingTb4b4b4(Tb4b4b4{
Te6edf3remote_identity_hashTff7b72: Ta5d6ff"aa"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4,
Te6edf3remote_identity_nameTff7b72: Ta5d6ff"Stranger"Tb4b4b4,
Te6edf3is_contactTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3playRingtoneTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"regression: contacts-only still rings for contacts"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3wrapper Tff7b72= Tff7b72await Te6edf3mountAppTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3config Tff7b72= Tb4b4b4{
Te6edf3do_not_disturb_enabledTff7b72: Tff7b72falseTb4b4b4,
Te6edf3telephone_allow_calls_from_contacts_onlyTff7b72: Tff7b72trueTb4b4b4,
Te6edf3block_all_from_strangersTff7b72: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3playRingtone Tff7b72= Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4, Ta5d6ff"playRingtone"Tb4b4b4)Tb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3spyOnTb4b4b4(Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4, Ta5d6ff"updateTelephoneStatus"Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tff7b72undefinedTb4b4b4)Tb4b4b4;
Tffa657globalThisTb4b4b4.Te6edf3Notification Tff7b72= Tff7b72class Tb4b4b4{
Tff7b72static Te6edf3requestPermissionTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Ta5d6ff"denied"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3handlers Tff7b72= Te6edf3wrapperTb4b4b4.Te6edf3vmTb4b4b4.Te6edf3getShellWsHandlersTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3handlersTb4b4b4.Te6edf3telephone_ringingTb4b4b4(Tb4b4b4{
Te6edf3remote_identity_hashTff7b72: Ta5d6ff"bb"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4,
Te6edf3remote_identity_nameTff7b72: Ta5d6ff"Friend"Tb4b4b4,
Te6edf3is_contactTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3playRingtoneTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTimesTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────